class AutoDoor {
  constructor() {
    this.currentState = 'closed'; // 初始状态：关闭
    this.closeDelay = 3000; // 延迟关闭时间（3秒）
    this.timer = null; // 超时定时器

    // 状态-行为映射对象（关联实例）
    this.stateToAction = {
      that: this,
      // 关闭状态：仅响应“有人靠近”
      closed() {
        console.log('门已关闭，等待触发...');
        this.that.onPersonApproach = () => {
          this.that.switchState('opened');
        };
      },
      // 开启状态：触发延迟关闭
      opened() {
        clearTimeout(this.that.timer);
        console.log('门已开启，3秒后自动关闭...');
        this.that.timer = setTimeout(() => {
          this.that.switchState('delayedClose');
        }, this.that.closeDelay);
        // 紧急按钮：强制关闭
        this.that.onEmergency = () => {
          this.that.switchState('closed');
        };
      },
      // 延迟关闭状态：执行关闭
      delayedClose() {
        clearTimeout(this.that.timer);
        console.log('延迟时间到，门正在关闭...');
        this.that.switchState('closed');
      }
    };

    // 初始化状态
    this.switchState('closed');
  }

  // 状态切换方法
  switchState(state) {
    // 切换状态前先清除可能存在的超时，避免在紧急关闭后仍触发延迟关闭逻辑
    if (this.timer) {
      clearTimeout(this.timer);
      this.timer = null;
    }
    this.currentState = state;
    this.stateToAction[state]?.();
  }

  // 模拟外部触发：有人靠近
  triggerApproach() {
    this.onPersonApproach?.();
  }

  // 模拟外部触发：紧急按钮
  triggerEmergency() {
    this.onEmergency?.();
  }
}

// 测试
const door = new AutoDoor(); // 输出：门已关闭，等待触发...
door.triggerApproach(); // 输出：门已开启，3秒后自动关闭...
// 3秒后输出：延迟时间到，门正在关闭... → 门已关闭，等待触发...
// door.triggerEmergency(); // 紧急按钮：立即关闭